package com.tjcd.project.library_base.base.bean;

import androidx.annotation.Keep;

import lombok.Data;

/**
 * @Author jiangKunKun
 * @CreateDate 2025/2/13
 * @Description
 * @SpittingGrooves
 */
@Keep
@Data
public class Resource<T> {
    /**
     * 请求状态
     * @LOADING 正在加载
     * @SUCCESS 请求成功
     * @ERROR 请求失败
     * @COMPLETED 请求完成
     */
    public enum Status {START, DATA_SUCCESS, DATA_FAIL, ERROR, FINISH}

    /**
     * 请求状态
     */
    private final Status status;
    /**
     * 请求数据
     */
    private final T data;
    /**
     * 请求信息
     */
    private final String msg;
    /**
     * 请求code
     */
    private int code;

    /**
     * 构造函数
     * @param status 请求状态 Status
     * @param data 请求数据
     * @param msg 请求信息
     */
    private Resource(Status status, T data, String msg) {
        this.status = status;
        this.data = data;
        this.msg = msg;
    }
    /**
     * 构造函数
     * @param status 请求状态 Status
     * @param data 请求数据
     * @param msg 请求信息
     */
    private Resource(Status status, T data, String msg, int code) {
        this.status = status;
        this.data = data;
        this.msg = msg;
        this.code = code;
    }

    /**
     * 开始
     * @return
     * @param <T>
     */
    public static <T> Resource<T> start() {
        return new Resource<>(Status.START, null, null);
    }

    /**
     * 服务器返回成功
     * @param data
     * @return
     * @param <T>
     */
    public static <T> Resource<T> dataSuccess(T data) {
        return new Resource<>(Status.DATA_SUCCESS, data, null);
    }

    /**
     * 服务器返回错误
     * @param data
     * @return
     * @param <T>
     */
    public static <T> Resource<T> dataFail(int code, String msg, T data) {
        return new Resource<>(Status.DATA_FAIL, data, msg, code);
    }
    public static <T> Resource<T> dataFail(T data) {
        return new Resource<>(Status.DATA_FAIL, data, null);
    }

    /**
     * 服务器返回错误
     * @param code
     * @param msg
     * @return
     * @param <T>
     */
    public static <T> Resource<T> dataFail(int code, String msg) {
        return dataFail(code, msg, null);
    }

    /**
     * http 失败/错误
     * @param message
     * @return
     * @param <T>
     */
    public static <T> Resource<T> error(String message) {
        return new Resource<>(Status.ERROR, null, message);
    }

    /**
     * 完成
     * @return
     * @param <T>
     */
    public static <T> Resource<T> finish() {
        return new Resource<>(Status.FINISH, null, null);
    }
}
